#ifndef __CLIENTE_H_INCLUDED__
#define __CLIENTE_H_INCLUDED__

#include "src/fifo/Fifo.h"
#include "src/GenericException.h"
#include "src/Mensajes.h"
#include "src/Tablero.h"

#include <iostream>
#include <sys/wait.h>
#include <stdlib.h>
#include <sstream>
#include <algorithm>

#define INVALIDO            0
#define CONECTANDO          1
#define CONECTADO           2
#define ESPERANDO_RESPUESTA 3
#define PREPARANDO_JUEGO    4
#define JUGANDO             5
#define ESPERANDO_ACEPTAR_INVITACION 6

class EstadoCliente;

class Cliente{
	friend class EstadoCliente;
	Fifo fifoServer;
	Fifo fifo;
	int pidTeclado;
	static bool salir;
	
public:
	static void setSalida(){ 
		salir=true; 
		fclose(0); //hack para eviar que el proceso del
			   //teclado se quede esperando
	}
	int pidPrincipal;
	EstadoCliente *estado;
	std::string nombre;
	int invitado;
	std::list<int> invitaciones; //Guardo los id's de los
				     //jugadores que me invitaron a
				     //jugar.
	Tablero tablero;
	void cambiarEstado(EstadoCliente* nuevo);

	Cliente(){
		invitado = 0;
		estado = NULL;
	}

	void enviarMensaje(Mensaje &m){
		m.setFuente(pidPrincipal);
		fifoServer.escribir(m.getBuffer(), m.size());
	}
	void finalizar();
private:

	void procesarTeclado(){
		while(!salir){
			std::string comando;
			std::cin >> comando;

			MensajeComando m;
			m.setComando(comando);
			fifo.escribir(m.getBuffer(), m.size());
		}
	}

	void procesarMensajes();


public:
	void run();
	~Cliente();
};


#include "src/EstadoCliente.h"

#endif //__CLIENTE_H_INCLUDED__
